本文介绍如何在本地制作Docker镜像,并以镜像方式将Go应用部署到Serverless应用引擎SAE(Serverless App Engine)

前提条件

步骤一:准备项目

  1. 下载Demo
    Demo内的Dockerfile内容如下:
    # Golang版本;Alpine镜像的体积较小。
    FROM golang:1.16.6-alpine3.14 as builder
    
    # 替换Alpine镜像,方便安装构建包。
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    
    # 安装构建阶段的依赖。
    RUN apk --update add gcc libc-dev upx ca-certificates && update-ca-certificates
    
    # 将代码复制到构建镜像中。
    # 注意地址不要在GOPATH中。
    ADD . /workspace
    
    WORKDIR /workspace
    
    # 挂载构建缓存。
    # GOPROXY防止下载失败。
    RUN --mount=type=cache,target=/go \
      env GOPROXY=https://goproxy.cn,direct \
      go build -buildmode=pie -ldflags "-linkmode external -extldflags -static -w" \
      -o /workspace/gin-hello-world
    
    # 运行时镜像。
    # Alpine兼顾了镜像大小和运维性。
    FROM alpine:3.14
    
    EXPOSE 8080
    
    # 方便运维人员安装需要的包。
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
    
    # 创建日志目录等。
    # RUN mkdir /var/log/onepilot -p && chmod 777 /var/log/onepilot && touch /var/log/onepilot/.keep
    
    # 复制构建产物。
    COPY --from=builder /workspace/gin-hello-world /app/
    
    # 指定默认的启动命令。
    CMD ["/app/gin-hello-world"]
  2. 在Demo所在目录,执行以下命令,构建镜像。
    docker build . -t gin-example
  3. 本地验证。
    1. 指定端口映射,格式为主机端口:容器端口,运行镜像。
      docker run -p 127.0.0.1:8080:8080/tcp gin-example
    2. 执行以下命令,查看请求是否返回正常。
      curl http://127.0.0.1:8080/
      输出如下:pg_go_response

步骤二:制作镜像

  1. 容器镜像服务控制台创建镜像仓库。
    个人版和企业版实例均适用本文的操作,本文以个人版实例为例。具体操作,请参见以下文档:
  2. 构建并推送镜像。
    您可以在目标镜像仓库的基本信息页面的镜像指南页签查询具体命令。更多信息,请参见以下文档:
    1. 执行以下命令,构建镜像。
      docker build --tag go-demo:v1 .
    2. 执行以下命令,登录远端镜像仓库。
      docker login --username=<镜像仓库登录名> registry.<regionId>.aliyuncs.com

      示例如下:

      docker login --username=****@188077086902**** registry.cn-hangzhou.aliyuncs.com
      在返回结果中输入密码,如果显示login succeeded,则表示登录成功。如何设置密码,请参见设置镜像仓库登录密码
    3. 执行以下命令,给镜像打标签。
      docker tag <ImageId> registry.<regionId>.aliyuncs.com/****/go-demo:<镜像版本号>
      • ImageId:镜像ID。
      • registry.<regionId>.aliyuncs.com/****/go-demo:镜像仓库地址。

      示例如下:

      docker tag go-demo:v1 registry.cn-hangzhou.aliyuncs.com/****/go-demo:v1
    4. 执行以下命令,推送镜像至个人版实例。
      docker push registry.<regionId>.aliyuncs.com/****/go-demo:<镜像版本号>

      示例如下:

      docker push registry.cn-hangzhou.aliyuncs.com/****/go-demo:v1
    成功推送后,您可以登录容器镜像服务控制台,在目标镜像仓库的镜像版本页面查看推送的版本。

步骤三:部署镜像

  1. 创建Go应用。
    应用部署配置页签,技术栈语言需选择其它语言应用部署方式需选择镜像。具体操作,请参见在SAE控制台使用镜像部署多语言应用
    说明 除创建新应用外,您还可以修改现有应用的配置镜像。具体操作,请参见升级应用
  2. 为Go应用绑定公网SLB。
    选择HTTP协议,并将HTTP端口设置为80容器端口设置为8080。具体操作,请参见为应用绑定SLB
    绑定完成后,您可以在应用访问设置区域查看公网访问地址。
  3. 验证结果。
    按照http://slbip:port/的格式,在浏览器地址栏输入步骤2设置的公网地址并回车。结果如下:pg_vertify_Internet_IP_of_Golang

更多信息

如果您不想每次都通过手动方式构建、推送镜像,并部署应用,可以对接开源的Jenkins或者阿里云云效。具体信息,请参见以下文档: